<chapter xml:id="posix.time.h">
<title><tt>__vic/posix/time.h</tt></title>

<p>Утилиты POSIX для работы со временем.</p>


<chapter xml:id="posix--time_spec">
<title><tt>posix::time_spec</tt></title>

<code-block lang="C++"><![CDATA[
struct posix::time_spec : ::timespec
{
    // Unit tags
    enum sec_units { sec };
    enum msec_units { msec };
    enum usec_units { usec };
    enum nsec_units { nsec };

    time_spec() = default;
    time_spec(time_t secs, long nsecs);

    time_spec(time_t secs, sec_units);
    time_spec(time_t msecs, msec_units);
    time_spec(time_t usecs, usec_units);
    time_spec(time_t nsecs, nsec_units);

    // BEGIN C++11
    template<class Rep, class Period>
    time_spec(std::chrono::duration<Rep,Period> d);

    operator std::chrono::nanoseconds() const;

    template<class Rep, class Period>
    time_spec &operator+=(std::chrono::duration<Rep,Period> t2);
    template<class Rep, class Period>
    time_spec &operator-=(std::chrono::duration<Rep,Period> t2);
    // END C++11

    time_spec &operator+=(time_spec t2);
    time_spec &operator-=(time_spec t2);
};

bool operator==(time_spec t1, time_spec t2);
bool operator!=(time_spec t1, time_spec t2);
bool operator< (time_spec t1, time_spec t2);
bool operator> (time_spec t1, time_spec t2);
bool operator<=(time_spec t1, time_spec t2);
bool operator>=(time_spec t1, time_spec t2);

time_spec operator+(time_spec t1, time_spec t2);
time_spec operator-(time_spec t1, time_spec t2);
]]></code-block>

<p>Удобная С++ обёртка для манипуляций с системным типом <tt>timespec</tt>.
Позволяет задавать время в различных единицах, а также складывать, отнимать и
сравнивать значения с использованием операторов C++.</p>

<section><title>Члены класса</title>

<synopsis>
<prototype>enum sec_units { sec }</prototype>
<prototype>enum msec_units { msec }</prototype>
<prototype>enum usec_units { usec }</prototype>
<prototype>enum nsec_units { nsec }</prototype>
<p>Тэги конструкторов для указания единиц измерения.</p>
</synopsis>

<synopsis>
<prototype>time_spec()</prototype>
<p>Создаёт неинициализированный объект.</p>
</synopsis>

<synopsis>
<prototype>time_spec(time_t secs, long nsecs)</prototype>
<p>Заполняет поля структуры указанными значениями.</p>
</synopsis>

<synopsis>
<prototype>time_spec(time_t secs, sec_units)</prototype>
<prototype>time_spec(time_t msecs, msec_units)</prototype>
<prototype>time_spec(time_t usecs, usec_units)</prototype>
<prototype>time_spec(time_t nsecs, nsec_units)</prototype>
<p>Задаёт время в секундах, миллисекундах, микросекундах и наносекундах,
соответсвенно.</p>
</synopsis>

<synopsis>
<prototype>template&lt;class Rep, class Period>
time_spec(std::chrono::duration&lt;Rep,Period> d) <badge>C++11</badge></prototype>
<p>Создаёт <tt>time_spec</tt> из <tt>std::chrono::duration</tt>.</p>
</synopsis>

<synopsis>
<prototype>operator std::chrono::nanoseconds() const <badge>C++11</badge></prototype>
<p>Преобразует значение в наносекунды.</p>
</synopsis>

<synopsis>
<prototype><![CDATA[template<class Rep, class Period>
time_spec &operator+=(std::chrono::duration<Rep,Period> t2)]]> <badge>C++11</badge></prototype>
<prototype>time_spec &amp;operator+=(time_spec t2)</prototype>
<prototype>time_spec operator+(time_spec t1, time_spec t2)</prototype>
<p>Складывает два значения.</p>
</synopsis>

<synopsis>
<prototype><![CDATA[template<class Rep, class Period>
time_spec &operator-=(std::chrono::duration<Rep,Period> t2)]]> <badge>C++11</badge></prototype>
<prototype>time_spec &amp;operator-=(time_spec t2)</prototype>
<prototype>time_spec operator-(time_spec t1, time_spec t2)</prototype>
<p>Вычисляет разность двух значений.</p>
<precondition><tt>t2 &lt;= t1</tt></precondition>
</synopsis>

<synopsis>
<prototype>bool operator==(time_spec t1, time_spec t2)</prototype>
<prototype>bool operator!=(time_spec t1, time_spec t2)</prototype>
<prototype>bool operator&lt; (time_spec t1, time_spec t2)</prototype>
<prototype>bool operator> (time_spec t1, time_spec t2)</prototype>
<prototype>bool operator&lt;=(time_spec t1, time_spec t2)</prototype>
<prototype>bool operator>=(time_spec t1, time_spec t2)</prototype>
<p>Операторы сравнения.</p>
</synopsis>

</section>

<section><title>Пример</title>
<code-block lang="C++"><![CDATA[
__vic::posix::time_spec t(5, __vic::posix::time_spec::sec);
::nanosleep(&t, nullptr); // sleep for 5 sec
]]></code-block>
</section>

</chapter>


<chapter xml:id="posix--nanoseconds_since_epoch">
<title><tt>posix::nanoseconds_since_epoch()</tt></title>

<code-block lang="C++"><![CDATA[
posix::time_spec posix::nanoseconds_since_epoch();
]]></code-block>

<p>Возвращает текущее количество секунд и наносекунд, прошедшее с наступления
эпохи UNIX. Использует <tt>posix::realtime_clock::get_time()</tt> для получения
значения, если он доступен. Реальная точность зависит от используемой платформы.
</p>

</chapter>


<chapter xml:id="posix--realtime_clock">
<title><tt>posix::realtime_clock</tt>, <tt>posix::monotonic_clock</tt></title>

<code-block lang="C++"><![CDATA[
#if _POSIX_TIMERS > 0

class posix::realtime_clock
{
public:
    static constexpr clockid_t id = CLOCK_REALTIME;
    static constexpr bool is_steady = false;
    // BEGIN C++11
    using duration   = std::chrono::nanoseconds;
    using period     = duration::period;
    using rep        = duration::rep;
    using time_point = std::chrono::time_point<realtime_clock, duration>;

    static time_point now();
    // END C++11

    static posix::time_spec get_time();
};
#ifdef _POSIX_MONOTONIC_CLOCK
class posix::monotonic_clock
{
public:
    static constexpr clockid_t id = CLOCK_MONOTONIC;
    static constexpr bool is_steady = true;
    // BEGIN C++11
    using duration   = std::chrono::nanoseconds;
    using period     = duration::period;
    using rep        = duration::rep;
    using time_point = std::chrono::time_point<monotonic_clock, duration>;

    static time_point now();
    // END C++11

    static posix::time_spec get_time();
};
#endif

#endif
]]></code-block>

<p>Системные часы POSIX (<tt>clock_gettime()</tt>) с интерфейсом часов
<tt>&lt;chrono></tt>. Отсутсвуют в системах, которые их не поддерживают
(проверяется макросом <tt>_POSIX_TIMERS</tt>). Дополнительно,
<tt>monotonic_clock</tt> доступен только, если определён макрос
<tt>_POSIX_MONOTONIC_CLOCK</tt>.</p>

<section><title>Члены класса</title>

<synopsis>
<prototype>static constexpr clockid_t id</prototype>
<p>Системный ID часов.</p>
</synopsis>

<synopsis>
<prototype>static time_spec get_time()</prototype>
<p>Возвращает текущее время в виде <tt>posix::time_spec</tt>.</p>
</synopsis>

<synopsis>
<prototype>static time_point now() <badge>C++11</badge></prototype>
<p>Возвращает текущее время в виде <tt>time_point</tt>.</p>
</synopsis>

</section>

</chapter>


</chapter>
